home *** CD-ROM | disk | FTP | other *** search
/ Aminet 32 / Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso / Aminet / dev / lang / Python152.lha / Python-1.5 / Demo / sockets / mcast.py < prev    next >
Text File  |  1998-01-15  |  2KB  |  95 lines

  1. # Send/receive UDP multicast packets.
  2. # Requires that your OS kernel supports IP multicast.
  3. # This is built-in on SGI, still optional for most other vendors.
  4. #
  5. # Usage:
  6. #   mcast -s (sender)
  7. #   mcast -b (sender, using broadcast instead multicast)
  8. #   mcast    (receivers)
  9.  
  10. MYPORT = 8123
  11. MYGROUP = '225.0.0.250'
  12.  
  13. import sys
  14. import time
  15. import struct
  16. import regsub
  17. from socket import *
  18.  
  19.  
  20. # Main program
  21. def main():
  22.     flags = sys.argv[1:]
  23.     #
  24.     if flags:
  25.         sender(flags[0])
  26.     else:
  27.         receiver()
  28.  
  29.  
  30. # Sender subroutine (only one per local area network)
  31. def sender(flag):
  32.     s = socket(AF_INET, SOCK_DGRAM)
  33.     if flag == '-b':
  34.         s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
  35.         mygroup = '<broadcast>'
  36.     else:
  37.         mygroup = MYGROUP
  38.         ttl = struct.pack('b', 1)        # Time-to-live
  39.         s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
  40.     while 1:
  41.         data = `time.time()`
  42. ##        data = data + (1400 - len(data)) * '\0'
  43.         s.sendto(data, (mygroup, MYPORT))
  44.         time.sleep(1)
  45.  
  46.  
  47. # Receiver subroutine (as many as you like)
  48. def receiver():
  49.     # Open and initialize the socket
  50.     s = openmcastsock(MYGROUP, MYPORT)
  51.     #
  52.     # Loop, printing any data we receive
  53.     while 1:
  54.         data, sender = s.recvfrom(1500)
  55.         while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
  56.         print sender, ':', `data`
  57.  
  58.  
  59. # Open a UDP socket, bind it to a port and select a multicast group
  60. def openmcastsock(group, port):
  61.     # Import modules used only here
  62.     import regsub
  63.     import struct
  64.     #
  65.     # Create a socket
  66.     s = socket(AF_INET, SOCK_DGRAM)
  67.     #
  68.     # Allow multiple copies of this program on one machine
  69.     # (not strictly needed)
  70.     s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  71.     #
  72.     # Bind it to the port
  73.     s.bind(('', port))
  74.     #
  75.     # Look up multicast group address in name server
  76.     # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
  77.     group = gethostbyname(group)
  78.     #
  79.     # Construct binary group address
  80.     bytes = eval(regsub.gsub('\.', ',', group))
  81.     grpaddr = 0
  82.     for byte in bytes: grpaddr = (grpaddr << 8) | byte
  83.     #
  84.     # Construct struct mreq from grpaddr and ifaddr
  85.     ifaddr = INADDR_ANY
  86.     mreq = struct.pack('ll', grpaddr, ifaddr)
  87.     #
  88.     # Add group membership
  89.     s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
  90.     #
  91.     return s
  92.  
  93.  
  94. main()
  95.